package com.itheima.advance.reflect.demo02;

import java.lang.reflect.Constructor;

/**
 * 获取构造方法并使用； 一般情况下我们都是获取指定的构造方法进行使用，就是去创建对象
 */
public class ReflectDemo02 {

    public static void main(String[] args) throws Exception {

        // 1. 获取字节码文件对象
        Class studentClazz = Class.forName("com.itheima.advance.reflect.demo02.Student");

        // 2. 获取指定的构造方法
        Constructor con = studentClazz.getDeclaredConstructor();

        // 3. 调用构造方法对象的方法去创建对象: public T newInstance​(Object... initargs)
        /**
         * initargs: 表示的就是在调用构造方法时所传入的实际参数
         */

        // 之前创建对象的方式：Student s = new Student();
        Student instance = (Student)con.newInstance();
        System.out.println(instance);

        System.out.println("----------------------------------------------------");

        // 获取公共的有参构造方法对象
        Constructor con2 = studentClazz.getDeclaredConstructor(String.class, int.class);
        Student instance2 = (Student)con2.newInstance("张三" , 23) ;
        System.out.println(instance2);

        System.out.println(instance == instance2 );

        System.out.println("----------------------------------------------------");

        // 获取有参的私有的构造方法,并使用
        Constructor con3 = studentClazz.getDeclaredConstructor(String.class);

        /**
         * 我们这个构造方法是通过private修饰，被private修饰的成员，只能在本类中使用
         */
        con3.setAccessible(true);           // 取消语法检查，暴力反射
        Student instance3 = (Student)con3.newInstance("李四");
        System.out.println(instance3);

    }

}
